package offer.day34;

public class No58First_ReverseSentence {
    /*
     * 面试题58：翻转字符串
     * 题目一：翻转单词顺序
     * 输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。
     * 为简单起见，标点符号和普通字母一样处理。
     * 例如：输入字符串“I am a student.”，则输出“student. a am I”
     *
     * 思路：
     * 1>  首先转换句子中所有的字符，此时不仅翻转了句子中单词的顺序，而且单词内的字符顺序也被翻转了。
     * 2>  然后再反转每个单词中字符的顺序，就可得到
     *
     * */
    public static void main(String[] args) {
        No58First_ReverseSentence r = new No58First_ReverseSentence();
        String s = "I am a student.";
        System.out.println(s + "翻转句子后的结果" + r.ReverseSentence(s));
    }

    private String ReverseSentence(String s) {
        if (s == null) return null;
        char[] c = s.toCharArray();
        int start = 0;
        int end = c.length - 1;
        c = Reverse(c, start, end);
        start = end = 0;
        while (start < c.length - 1) {
            if (c[start] == ' ') {
                start++;
                end++;
            } else if (c[end] == ' ' || end == c.length - 1) {

                c = Reverse(c, start, --end);

                start = ++end;

            } else

                end++;

        }
        s = String.copyValueOf(c);
        return s;
    }

    private char[] Reverse(char[] c, int start, int end) {
        if (start >= end) {
            return c;
        }
        while (start < end) {
            char tmp = c[start];
            c[start] = c[end];
            c[end] = tmp;
            start++;
            end--;
        }
        return c;
    }
}
